home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / util / umask / umask.c < prev   
C/C++ Source or Header  |  1994-02-24  |  3KB  |  125 lines

  1. RCS_ID_C="$Id: umask.c,v 2.2 1994/02/17 02:12:13 ppessi Exp $";
  2. /*
  3.  * umask.c -- print or change the umask
  4.  *
  5.  * Author: ppessi <Pekka.Pessi@hut.fi>
  6.  *
  7.  * Copyright © 1994 AmiTCP/IP Group, <AmiTCP-group@hut.fi>
  8.  *                  Helsinki University of Technology, Finland.
  9.  *
  10.  * Created      : Tue Jan 11 22:33:06 1994 ppessi
  11.  * Last modified: Thu Feb 17 01:07:18 1994 ppessi
  12.  */
  13.  
  14. #include "umask_rev.h"
  15.  
  16. static const char version[] = VERSTAG " "
  17. "Copyright © 1994 AmiTCP/IP Group, <amitcp-group@hut.fi>\n"
  18.   "Helsinki University of Technology, Finland.\n";
  19.  
  20. #include <pwd.h>
  21. #include <grp.h>
  22. #include <unistd.h>
  23.  
  24. #include <proto/usergroup.h>
  25. #include <proto/dos.h>
  26.  
  27. #include <clib/exec_protos.h>
  28. extern struct ExecBase* SysBase;
  29. #include <pragmas/exec_sysbase_pragmas.h>
  30.  
  31. #include <dos/dos.h>
  32.  
  33. #include <string.h>
  34. #include <stdlib.h>
  35.  
  36. #define USERGROUPVERSION 2    /* minimum version to use */
  37.  
  38. #ifndef MAXLINELENGTH 
  39. #define MAXLINELENGTH 1024
  40. #endif
  41.  
  42. LONG UMask(void)
  43. {
  44.   LONG retval = RETURN_FAIL;
  45.   struct DosLibrary *DOSBase;
  46.   struct ExecBase *SysBase;
  47.   struct Library *UserGroupBase;
  48.  
  49.   SysBase = *(struct ExecBase**)4;
  50.   DOSBase = (struct DosLibrary *)OpenLibrary("dos.library", 37L);
  51.   UserGroupBase = OpenLibrary(USERGROUPNAME, USERGROUPVERSION);
  52.   
  53.   if (DOSBase && UserGroupBase) {
  54.     mode_t mask = getumask();
  55.  
  56.     const char *template = "-S=SYMBOLIC/S,mask";
  57.     struct {
  58.       LONG   a_symbolic;
  59.       STRPTR a_newmask;
  60.     } args[1] = { 0 };
  61.     struct RDArgs *rdargs = NULL;
  62.  
  63.     retval = RETURN_OK;
  64.  
  65.     rdargs = ReadArgs((UBYTE *)template, (LONG *)args, NULL);
  66.  
  67.     if (rdargs == NULL) {
  68.       PrintFault(IoErr(), "umask");
  69.       retval = RETURN_ERROR;
  70.     } else if (args->a_newmask) {
  71.       mode_t newmask = 0;
  72.       UBYTE *np = args->a_newmask, c;
  73.  
  74.       for (;;) {
  75.     c = *np++;
  76.  
  77.     if (c == '\0') {
  78.       umask(newmask);
  79.       retval = RETURN_OK;
  80.       break;
  81.     } else if (c >= '0' && c < '8') {
  82.       newmask <<= 3;
  83.       newmask += c - '0';
  84.       if (newmask > 0777)
  85.         break;
  86.     } else {
  87.       break;
  88.     }
  89.       }
  90.       if (c) {
  91.     Printf("umask: `%s' is not octal mask from 000 to 777\n", 
  92.            args->a_newmask);
  93.       }
  94.     } else if (args->a_symbolic) {
  95.       static const char symbolic[] = 
  96.     "rwx\0" "rw\0\0" "rx\0\0" "r\0\0\0" "wx\0\0" "w\0\0\0" "x\0\0\0" "";
  97.       Printf("u=%s,g=%s,o=%s\n", 
  98.          symbolic + 4 * ((mask >> 6) & 7),
  99.          symbolic + 4 * ((mask >> 3) & 7),
  100.          symbolic + 4 * ((mask >> 0) & 7));
  101.       retval = RETURN_OK;
  102.     } else {
  103.       Printf("%lc%lc%lc\n",
  104.          mask >> 6 & 7 | '0',
  105.          mask >> 3 & 7 | '0',
  106.          mask >> 0 & 7 | '0');
  107.       retval = RETURN_OK;
  108.     }
  109.     if (rdargs) {
  110.       FreeArgs(rdargs);
  111.     }
  112.   }
  113.  
  114.   if (UserGroupBase) {
  115.     CloseLibrary(UserGroupBase);
  116.   } else {
  117.     Printf("id: cannot open %s\n", USERGROUPNAME);
  118.   }
  119.  
  120.   if (DOSBase)
  121.     CloseLibrary((struct Library *)DOSBase);
  122.  
  123.   return retval;
  124. }
  125.